﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Linq;

namespace PlanoAulaHelper
{
    public partial class UnidadeAvaliacaoForm : FormEdicao
    {
        public UnidadeAvaliacaoForm(int idPlanoAula) : base(idPlanoAula)
        {
            InitializeComponent();
        }
        private void UnidadeAvaliacaoForm_Load(object sender, EventArgs e)
        {
            AtualizarGridUnidade();
            this.MarcarProvaReadOnly(true);
            this.MarcarUnidadeReadOnly(true);
        }

#region Unidade
        private void AtualizarGridUnidade()
        {
            using (dbContext db = new dbContext())
            {
                unidadeAvaliacaoBindingSource.DataSource = from u in db.UnidadeAvaliacaos
                                                           where u.IdPlanoAulaCab == IdItem
                                                           select u;
            }
        }

        int idUnidade = 0;
        UnidadeAvaliacao Unidade = null;

        private void atualizarUnidadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AtualizarGridUnidade();
        }
        private void HabilitarAvaliacao(bool habilitar)
        {
            MarcarProvaReadOnly(!habilitar);
            gbxProvas.Enabled = habilitar;
        }
        private void novaUnidadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.idUnidade = 0;
            edtNome.Text = "";
            HabilitarAvaliacao(false);
            tabPageUnidade.Focus();
            edtNome.Focus();
            MarcarUnidadeReadOnly(false);
            MarcarProvaReadOnly(true);
        }
        private void SetarCampos(UnidadeAvaliacao unidade)
        {
            if (unidade == null)
                unidade = new UnidadeAvaliacao();
            edtNome.Text = unidade.Nome;
            AtualizarGridProvas(Unidade);
        }
        private void editarUnidadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using ( dbContext db = new dbContext() )
            {
                UnidadeAvaliacao unidade = unidadeAvaliacaoBindingSource.Current as UnidadeAvaliacao;
                this.idUnidade = unidade.Id;
                SetarCampos(unidade);
                MarcarUnidadeReadOnly(false);
                MarcarProvaReadOnly(true);
            }        
        }
        private void excluirUnidadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (dbContext db = new dbContext())
            {
                db.Connection.Open();
                using (db.Transaction = db.Connection.BeginTransaction())
                {
                    UnidadeAvaliacao unidade = (UnidadeAvaliacao)unidadeAvaliacaoBindingSource.Current;
                    UnidadeAvaliacao Unid = (from u in db.UnidadeAvaliacaos
                                             where u.Id == unidade.Id
                                             select u).Single();

                    db.Avaliacaos.DeleteAllOnSubmit(Unid.Avaliacaos);
                    db.UnidadeAvaliacaos.DeleteOnSubmit(Unid);
                    db.SubmitChanges();
                    db.Transaction.Commit();
                }
            }
            AtualizarGridUnidade();
        }
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            using (dbContext db = new dbContext())
            {
                var planoAula = (from p in db.PlanoAulaCabs
                                where p.Id == IdItem
                                    select p).Single();
                if (idUnidade == 0)
                {
                    planoAula.UnidadeAvaliacaos.Add(new UnidadeAvaliacao { Nome = edtNome.Text });
                }
                else
                {
                    var uni = (from u in planoAula.UnidadeAvaliacaos
                               where u.Id == idUnidade
                               select u).Single();
                    uni.Nome = edtNome.Text;
                }

                db.SubmitChanges( System.Data.Linq.ConflictMode.FailOnFirstConflict );
            }
            AtualizarGridUnidade();
            HabilitarAvaliacao(true);
            MarcarUnidadeReadOnly(true);
            MarcarProvaReadOnly(true);

        }
        private void dgvUnidade_DoubleClick(object sender, EventArgs e)
        {
            editarUnidadeToolStripMenuItem_Click(sender, e);
        }
        private void dgvUnidade_SelectionChanged(object sender, EventArgs e)
        {
            MarcarUnidadeReadOnly(true);
            UnidadeAvaliacao unidade = unidadeAvaliacaoBindingSource.Current as UnidadeAvaliacao;
            SetarCampos(unidade);
        }
#endregion Unidade
        private int idProva = 0;
        private void AtualizarGridProvas(UnidadeAvaliacao Unidade)
        {
            using (dbContext db = new dbContext())
            {
                UnidadeAvaliacao unid = (UnidadeAvaliacao)unidadeAvaliacaoBindingSource.Current;
                
                avaliacaoBindingSource.DataSource = from prova in db.Avaliacaos
                                                        where prova.IdUnidadeAvaliacao == unid.Id
                                                        select prova;
            }
        }

        private void btnSalvarProva_Click(object sender, EventArgs e)
        {
            using (dbContext db = new dbContext())
            {
                db.CommandTimeout = 90;
                
                var unidade = db.UnidadeAvaliacaos.Single( c => c.Id == ((UnidadeAvaliacao)unidadeAvaliacaoBindingSource.Current).Id);
                //var unidade = (from p in db.UnidadeAvaliacaos
                //                where p.Id == 
                //                    select p).Single();
                
                var avaliacao = unidade.Avaliacaos.SingleOrDefault( a => a.Id == idProva);
                if (avaliacao == null)
                {
                    avaliacao = new Avaliacao();
                    unidade.Avaliacaos.Add(avaliacao);
                }
                avaliacao.NotaMax = notaMaxTextBox.Text.To<decimal?>("Informe uma nova no formato 999.99");
                avaliacao.Assuntos = assuntosTextBox.Text;
                avaliacao.DataMarcada = dataMarcadaDateTimePicker.Value.Date;


                var planoAulaDet = db.PlanoAulaDetalhes.SingleOrDefault(p => p.Data == avaliacao.DataMarcada && p.IdPlanoAulaCab == IdItem );

                if (planoAulaDet != null)
                    avaliacao.IdPlanoAulaDetalhe = planoAulaDet.Id;
                else
                    avaliacao.IdPlanoAulaDetalhe = null;
                avaliacao.DataRealizacao = dataRealizacaoDateTimePicker.Value.Date;
                avaliacao.Nome = nomeTextBox.Text;
                avaliacao.Observacao = observacaoTextBox.Text;
                avaliacao.Situacao = cmbSituacao.SelectedItem.ToString();
               
                db.SubmitChanges();
                AtualizarGridProvas(unidade);
                MarcarProvaReadOnly(true);
            }
        }
        private void SetarCampos(Avaliacao avaliacao)
        {
            if (avaliacao == null)
            {
                avaliacao = new Avaliacao();
            }
            nomeTextBox.Text = avaliacao.Nome;
            assuntosTextBox.Text = avaliacao.Assuntos;
            dataMarcadaDateTimePicker.Value = avaliacao.DataMarcada.GetValueOrDefault(DateTime.Today);
            dataRealizacaoDateTimePicker.Value = avaliacao.DataRealizacao.GetValueOrDefault(DateTime.Now);
            notaMaxTextBox.Text = avaliacao.NotaMax.ToString();
            observacaoTextBox.Text = avaliacao.Observacao;
            if (avaliacao.Id == 0)
            {
                cmbSituacao.SelectedItem = "Aberta";
            }
            else
            {
                cmbSituacao.SelectedItem = avaliacao.Situacao;
            }
        }
        private void novaProvaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.idProva = 0;
            SetarCampos(new Avaliacao());
            tabPageAvaliacao.Focus();
            nomeTextBox.Focus();
            MarcarProvaReadOnly(false);

        }

        private void atualizarProvaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AtualizarGridProvas((UnidadeAvaliacao)unidadeAvaliacaoBindingSource.Current);
        }

        private void editarProvaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (dbContext db = new dbContext())
            {
                Avaliacao avaliacao = avaliacaoBindingSource.Current as Avaliacao;
                SetarCampos(avaliacao);
                this.idProva= avaliacao.Id;
                MarcarProvaReadOnly(false);
            }
        }

        private void excluirProvaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (dbContext db = new dbContext())
            {
                Avaliacao prova = (Avaliacao)avaliacaoBindingSource.Current;
                
                var avaliacoes = from ava in db.Avaliacaos
                                 where ava.Id == prova.Id
                                 select ava;
                db.Avaliacaos.DeleteAllOnSubmit(avaliacoes);
                db.SubmitChanges();
            }
            AtualizarGridUnidade();
        }

       
        private void dgvProvas_DoubleClick(object sender, EventArgs e)
        {
            editarProvaToolStripMenuItem_Click(sender, e);
        }

        

        private void MarcarUnidadeReadOnly(bool readOnly)
        {
            edtNome.ReadOnly = readOnly;
        }

        private void dgvProvas_SelectionChanged(object sender, EventArgs e)
        {
            MarcarProvaReadOnly(true);
            SetarCampos(avaliacaoBindingSource.Current as Avaliacao);
        }

        private void MarcarProvaReadOnly(bool readOnly)
        {
            gbxEdicaoProvas.Enabled = !readOnly;
        }

        private void toolStripButtonVisualizar_Click(object sender, EventArgs e)
        {
            new Reports.relAvaliacaoForm(IdItem).ExbirFormulario(this);
        }

        private void dataMarcadaDateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            if (dataRealizacaoDateTimePicker.Value < dataMarcadaDateTimePicker.Value)
            {
                dataRealizacaoDateTimePicker.Value = dataMarcadaDateTimePicker.Value.AddMonths(2);
            }
        }

        

      

     

       


    }
}
